{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**通用最佳实践回顾**\n",
    "\n",
    "- `std::flat_set<Key>`（C++23 起）以连续内存存放有序唯一键，查找用二分搜索达到 `O(log n)`，遍历则缓存友好；插入/删除需移动元素，通常 `O(n)`，因此特别适合小至中等规模的读多写少集合。\n",
    "- 构造时若能提供已排序且唯一的区间，可避免额外排序成本；若需构造后再插入，优先批量收集到 `std::vector` 排序去重后再用范围构造。\n",
    "- 插入会使迭代器失效（底层类似 `std::vector`），删除也可能移动元素；运行期若需频繁修改，应改用 `std::set` / `std::unordered_set`。\n",
    "- `reserve` 能提前分配空间，减少构造期重分配；连续存储让 `lower_bound`、`upper_bound` 等 STL 算法可直接作用在底层区间上。\n",
    "- 透明比较器（如 `std::less<>`）支持异构查找，避免临时字符串分配；结合 `contains`、`find` 快速检索。\n",
    "- C++23 之前可使用 `boost::container::flat_set` 或自行维护排序 `std::vector` + `std::binary_search` 实现类似行为。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 序号 | 工程场景                         | 文件名                       | 说明要点                                                     | 可运行示例代码           |\n",
    "| ---- | -------------------------------- | ---------------------------- | ------------------------------------------------------------ | ------------------------ |\n",
    "| 1    | 小/中规模有序集合读多写少        | `flat_set_feature_flags.cpp` | 启动期一次性加载功能开关集合，运行期频繁查询；演示 `contains`、`lower_bound` | 示例 1：功能开关集合查询 |\n",
    "| 2    | 字面量关键字/命令集合匹配        | `flat_set_keyword_match.cpp` | 以 `flat_set` 保存命令字面量；利用透明比较器和 `find` / `contains` 实现高频匹配 | 示例 2：命令关键字匹配   |\n",
    "| 3    | 热路径 ID 白名单（缓存敏感场景） | `flat_set_hotpath_ids.cpp`   | 通过连续存储提升缓存命中；展示 `reserve`、`contains` 在高频校验中的使用 | 示例 3：热路径 ID 校验   |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 示例 1：功能开关集合查询（flat_set_feature_flags.cpp）\n",
    "- 示例 2：命令关键字匹配（flat_set_keyword_match.cpp）\n",
    "- 示例 3：热路径 ID 校验（flat_set_hotpath_ids.cpp）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
